package java_design_model.com.State.abc;

import java.util.ArrayList;

public class DD implements MM {
    State state;
    ArrayList<State> arrayList=new ArrayList<>();
    DD(State state){
        this.state=state;
        arrayList.add(state);
    }
    /*设置一个主类CC有方法可以改变状态
    * 由主类维护状态数组，每次设置新的状态的时候，添加状态
    * 每次调用方法后会循环变化成下一个状态
    * 优：方便添加新的状态，状态与主类的耦合性，状态与状态之间的耦合性降低
    * 适用：最好每个状态都必须，状态数量较少，并且经常转换状态，而且转换规则明确的情况
    * 缺：1、arrayList.contains本质是一个for循环（n），arrayList是一个数组，在状态量太大的情况，主类的时间和空间会大涨。
    *      2、转换状态的规则不明确以及混乱的时候，编码估计很麻烦。
    * */
    public void setState(State state) {
        this.state = state;
        if(!arrayList.contains(state)){
            arrayList.add(state);
        }
    }

    public void show(){
        /*展示当前状态后切换状态
        * 不通过状态类修改状态
        * */
        this.state.showState();
        if(arrayList.contains(this.state)){
            int indexOf = arrayList.indexOf(this.state);
            if(arrayList.size()==indexOf+1){
                this.setState(arrayList.get(0));
            }else {
                this.setState(arrayList.get(indexOf+1));
            }
        }
//        this.state.changState(this);
    }


}
